package com.shuang.greed2;

public class WiggleMaxLength {
    //贪心：
    //局部最优：删除单调坡度上的节点（不包括单调坡度两端的节点），那么这个坡度就可以有两个局部峰值。
    //整体最优：整个序列有最多的局部峰值，从而达到最长摆动序列。
    //有一个峰值计数加一 证明有一个摆动
    public int wiggleMaxLength(int[] nums) {

        //考虑三种情况：
        //情况一：上下坡中有平坡
        // 情况二：数组首尾两端
        // 情况三：单调坡中有平坡

        //三个元素判断坡情况
        int curDiff = 0; //当前指向的元素的后面的坡
        int preDiff = 0; //当前指向的元素的前面的坡

        //只有一个元素一定是摆动的 所以最后一个元素一定是摆动的 设置结果初始化为1
        int count = 1;

        //最后一个元素已经加进来了 i 最后指向倒数第二个元素即可
        for (int i = 0; i < nums.length - 1; i++){
            //为curDiff赋值
            curDiff = nums[i + 1] - nums[i];

            if ((preDiff <= 0 && curDiff > 0) || (preDiff >= 0 && curDiff < 0)){

                //等于号相当于考虑到上下坡有平坡的情况

                //当i为0时 指向第一个元素 而preDiff一开始为0 相当于虚拟在第一个元素的前面加一个与第一个元素相等的元素 即前面的坡为平坡
                //满足条件 计数加一
                count++;

                //满足条件的时候preDiff才移到curDiff的位置为下一次判断做准备（满足情况三）
                preDiff = curDiff;
            }
        }

        return count;
    }
}
